package com.atguigu.interview.study.thread;

import java.util.concurrent.*;

/**
 * @author gcq
 * @Create 2020-11-30
 * 第四种获得/使用Java多线程的方式，线程池
 * 1、继承Thread
 * 2、实现Runnable
 * 3、实现Callable，通过FutureTask
 * 4、线程池
 */
public class MyThreadPoolDemo {
    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
                2,                                // 常驻核心线程数
                5,                            // 最大线程数
                1L,                             // 存活时间
                TimeUnit.SECONDS,                            //计算单位
                new LinkedBlockingQueue<Runnable>(3),// 阻塞队列
                Executors.defaultThreadFactory(),            // 默认工厂
                new ThreadPoolExecutor.DiscardPolicy());     // 拒绝策略
        // AbortPolicy
        // 模拟10个用户来办理业务，每个用户就是一个来自外部的请求线程
        try {
            for(int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
                // 暂停一会线程
//                try { TimeUnit.MILLISECONDS.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }

    }

    private static void threadPoolInit() {
        // 处理器数量
        // System.out.println(Runtime.getRuntime().availab   leProcessors());

//        ExecutorService threadPool = Executors.newFixedThreadPool(5); // 一池处理五个线程
//        ExecutorService threadPool = Executors.newSingleThreadExecutor(); // 一池1个处理线程
        ExecutorService threadPool = Executors.newCachedThreadPool(); // 一池处理N个线程

        // 模拟10个用户来办理业务，每个用户就是一个来自外部的请求线程
        try {
            for(int i = 1; i <= 10; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 办理业务");
                });
                // 暂停一会线程
//                try { TimeUnit.MILLISECONDS.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}